//
// Created by denglibin on 19-4-14.
//

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
/*
重定向编程dup2
头文件：#include<unistd.h>
定义函数：int dup2(int oldfd, int newfd);
函数说明：
    dup2用来复制参数oldfd所指的文件描述符，并将oldfd拷贝到参数newfd后一起返回。若参数newfd为一个打开的文件描述符，则newfd所指的文件会先被关闭，
 若newfd等于oldfd，则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。
共享所有的锁定，读写位置和各项权限或flags等等.
    返回值：如成功则返回新的文件描述符，否则出错返回-1. 注意：由dup2函数返回的新文件描述符一定是当前可用文件描述符中的最小值。
*/

static int main_(int argc, char** argv)
{

    int fd;
    int refd;
    char * buf="Advanced Programming!\n";
    fd = open("testdup2.txt",O_RDWR|O_CREAT,0644);
    if(fd==-1)
    {
        printf("open file error:%m\n");
        exit(-1);
    }
    refd = dup2(fd,fileno(stdout));
    if(refd==-1)
    {
        printf("redirect standard out error:%m\n");
        exit(-1);
    }

    //写数据，本应该写入到stdout的信息重定向而写入到目标文件中（testdup2.txt）
    printf("dup2的返回值：%d\n",refd);
    write(fileno(stdout),buf, strlen(buf));
    close(fd);
    return 0;
}
